home *** CD-ROM | disk | FTP | other *** search
/ SuperHack / SuperHack CD.bin / CODING / WINDOWS / DIRECT3D.ZIP / TEXTURE.C < prev    next >
Encoding:
C/C++ Source or Header  |  1996-09-18  |  7.0 KB  |  217 lines

  1. #include <windows.h>
  2. #include <ddraw.h>
  3. #include <stdio.h>
  4. #include "d3d.h"
  5. #include "dxproto.h"
  6. #include "d3dmacs.h"
  7.  
  8. BOOL LoadTextureSurf(DXDevice *Dev, int n)
  9. {
  10.     DDSURFACEDESC ddsd;
  11.     LPDIRECTDRAWSURFACE lpSrcTextureSurf = NULL;
  12.     LPDIRECT3DTEXTURE lpSrcTexture = NULL;
  13.  
  14.     RELEASE(Dev->TextureSurface[n]);
  15.     lpSrcTextureSurf = LoadSurface(Dev->lpDD, Dev->TextureFile[n],
  16.                                    &Dev->TextureDesc.Desc,
  17.                                    DDSCAPS_SYSTEMMEMORY);
  18.     lpSrcTextureSurf->lpVtbl->QueryInterface(lpSrcTextureSurf,
  19.                                              &IID_IDirect3DTexture,
  20.                                              (LPVOID*)&lpSrcTexture);
  21.     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
  22.     ddsd.dwSize = sizeof(DDSURFACEDESC);
  23.     lpSrcTextureSurf->lpVtbl->GetSurfaceDesc(lpSrcTextureSurf, &ddsd);
  24.  
  25.     ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
  26.     ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_ALLOCONLOAD;
  27.  
  28.     Dev->lpDD->lpVtbl->CreateSurface(Dev->lpDD, &ddsd,
  29.                                      &Dev->TextureSurface[n], NULL);
  30.  
  31.     Dev->TextureSurface[n]->lpVtbl->QueryInterface(Dev->TextureSurface[n],
  32.                                                      &IID_IDirect3DTexture,
  33.                                                      (LPVOID*)&Dev->D3DTexture[n]);
  34.     Dev->D3DTexture[n]->lpVtbl->Load(Dev->D3DTexture[n], lpSrcTexture);
  35.  
  36.     RELEASE(lpSrcTexture);
  37.     RELEASE(lpSrcTextureSurf);
  38.     return TRUE;
  39. }
  40.  
  41. BOOL ReloadTextureSurf(DXDevice *Dev, int n)
  42. {
  43.     LPDIRECTDRAWSURFACE lpSrcTextureSurf = NULL;
  44.     LPDIRECT3DTEXTURE lpSrcTexture = NULL;
  45.  
  46.     lpSrcTextureSurf = LoadSurface(Dev->lpDD, Dev->TextureFile[n],
  47.                                    &Dev->TextureDesc.Desc,
  48.                                    DDSCAPS_SYSTEMMEMORY);
  49.     lpSrcTextureSurf->lpVtbl->QueryInterface(lpSrcTextureSurf,
  50.                                              &IID_IDirect3DTexture,
  51.                                              (LPVOID*)&lpSrcTexture);
  52.  
  53.     Dev->D3DTexture[n]->lpVtbl->Load(Dev->D3DTexture[n], lpSrcTexture);
  54.  
  55.     RELEASE(lpSrcTexture);
  56.     RELEASE(lpSrcTextureSurf);
  57.  
  58.     return TRUE;
  59. }
  60.  
  61. BOOL GetTextureHandle(DXDevice *Dev, int n)
  62. {
  63.     Dev->D3DTexture[n]->lpVtbl->GetHandle(Dev->D3DTexture[n],
  64.                                          Dev->lpD3DDevice,
  65.                                          &Dev->TextureHandle[n]);
  66.     return TRUE;
  67. }
  68.  
  69. void ReleaseTexture(DXDevice *Dev, int n)
  70. {
  71.     RELEASE(Dev->D3DTexture[n]);
  72.     RELEASE(Dev->TextureSurface[n]);
  73.     Dev->TextureHandle[n] = 0;
  74. }
  75.  
  76. void ReleaseAllTextures(DXDevice *Dev)
  77. {
  78.     int i;
  79.  
  80.     for (i = 0; i < Dev->NumTextures; i++)
  81.         ReleaseTexture(Dev, i);
  82. }
  83.  
  84. BOOL LoadAllTextures(DXDevice *Dev)
  85. {
  86.     int i;
  87.  
  88.     for (i = 0; i < Dev->NumTextures; i++)
  89.     {
  90.         LoadTextureSurf(Dev, i);
  91.         GetTextureHandle(Dev, i);
  92.     }
  93.     return TRUE;
  94. }
  95.  
  96. LPDIRECTDRAWSURFACE LoadSurface(LPDIRECTDRAW lpDD, LPCSTR lpName,
  97.                                      LPDDSURFACEDESC lpFormat, DWORD memoryflag)
  98. {
  99.     LPDIRECTDRAWSURFACE lpDDS;
  100.     DDSURFACEDESC ddsd, format;
  101.     DWORD dwWidth, dwHeight;
  102.     FILE *fp;
  103.     CHAR buf[100];
  104.     DWORD *lpLP;
  105.     WORD *lpSP;
  106.     DWORD m;
  107.     int i, j, s;
  108.     int red_shift, red_scale;
  109.     int green_shift, green_scale;
  110.     int blue_shift, blue_scale;
  111.     int alpha_shift = 0, alpha_scale = 0;
  112.     
  113.     fp = fopen(lpName, "rb");
  114.     fgets(buf, sizeof buf, fp);
  115.     if(lstrcmp(buf, "P6\n"))
  116.     {
  117.         fclose(fp);
  118.         return NULL;
  119.     }
  120.     do
  121.     {
  122.         fgets(buf, sizeof buf, fp);
  123.     } while (buf[0] == '#');
  124.     sscanf(buf, "%d %d\n", &dwWidth, &dwHeight);
  125.     fgets(buf, sizeof buf, fp);
  126.  
  127.     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
  128.     memcpy(&format, lpFormat, sizeof(DDSURFACEDESC));
  129.     memcpy(&ddsd, lpFormat, sizeof(DDSURFACEDESC));
  130.     ddsd.dwSize = sizeof(DDSURFACEDESC);
  131.     ddsd.dwFlags = DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT;
  132.     ddsd.ddsCaps.dwCaps = DDSCAPS_TEXTURE | DDSCAPS_SYSTEMMEMORY;
  133.     ddsd.dwHeight = dwHeight;
  134.     ddsd.dwWidth = dwWidth;
  135.  
  136.     lpDD->lpVtbl->CreateSurface(lpDD, &ddsd, &lpDDS, NULL);
  137.     memset(&ddsd, 0, sizeof(DDSURFACEDESC));
  138.     ddsd.dwSize = sizeof(DDSURFACEDESC);
  139.     lpDDS->lpVtbl->Lock(lpDDS, NULL, &ddsd, 0, NULL);
  140.  
  141.     for(s = 0, m = format.ddpfPixelFormat.dwRBitMask; !(m & 1);
  142.                                                        s++, m >>= 1);
  143.     red_shift = s;
  144.     red_scale = 255 / (format.ddpfPixelFormat.dwRBitMask >> s);
  145.     for (s = 0, m = format.ddpfPixelFormat.dwGBitMask; !(m & 1);
  146.                                                        s++, m >>= 1);
  147.     green_shift = s;
  148.     green_scale = 255 / (format.ddpfPixelFormat.dwGBitMask >> s);
  149.     for (s = 0, m = format.ddpfPixelFormat.dwBBitMask; !(m & 1);
  150.                                                        s++, m >>= 1);
  151.     blue_shift = s;
  152.     blue_scale = 255 / (format.ddpfPixelFormat.dwBBitMask >> s);
  153.  
  154.     if(format.ddpfPixelFormat.dwRGBAlphaBitMask)
  155.     {
  156.         for (s = 0, m = format.ddpfPixelFormat.dwRGBAlphaBitMask; !(m & 1);
  157.                                                            s++, m >>= 1);
  158.         alpha_shift = s;
  159.         alpha_scale = 255 / (format.ddpfPixelFormat.dwRGBAlphaBitMask >> s);
  160.     }
  161.     
  162.     switch (format.ddpfPixelFormat.dwRGBBitCount)
  163.     {
  164.         case 32 :
  165.             for (j = 0; j < (int)dwHeight; j++)
  166.             {
  167.                 lpLP = (unsigned long*)(((char*)ddsd.lpSurface) +
  168.                                                 ddsd.lPitch * j);
  169.                 for (i = 0; i < (int)dwWidth; i++)
  170.                 {
  171.                     int r, g, b, a;
  172.                     r = getc(fp) / red_scale;
  173.                     g = getc(fp) / green_scale;
  174.                     b = getc(fp) / blue_scale;
  175.                     if(format.ddpfPixelFormat.dwRGBAlphaBitMask)
  176.                         a = 127 / alpha_scale;
  177.                     else
  178.                         a = 0;
  179.                     *lpLP = (r << red_shift) | (g << green_shift) |
  180.                             (b << blue_shift) | (a << alpha_shift);
  181.                     lpLP++;
  182.                 }
  183.             }
  184.             break;
  185.         case 16 :
  186.             for (j = 0; j < (int)dwHeight; j++)
  187.             {
  188.                 lpSP = (unsigned short*)(((char*)ddsd.lpSurface) +
  189.                                                  ddsd.lPitch * j);
  190.                 for (i = 0; i < (int)dwWidth; i++)
  191.                 {
  192.                     int r, g, b, a;
  193.                     r = getc(fp) / red_scale;
  194.                     g = getc(fp) / green_scale;
  195.                     b = getc(fp) / blue_scale;
  196.                     if(format.ddpfPixelFormat.dwRGBAlphaBitMask)
  197.                         a = 255 / alpha_scale;
  198.                     else
  199.                         a = 0;
  200.                     *lpSP = (r << red_shift) | (g << green_shift) |
  201.                             (b << blue_shift) | (a << alpha_shift);
  202.                     lpSP++;
  203.                 }
  204.             }
  205.             break;
  206.         default:
  207.             lpDDS->lpVtbl->Unlock(lpDDS, NULL);
  208.             fclose(fp);
  209.             lpDDS->lpVtbl->Release(lpDDS);
  210.             return NULL;
  211.     }
  212.     lpDDS->lpVtbl->Unlock(lpDDS, NULL);
  213.     fclose(fp);
  214.     return (lpDDS);
  215. }
  216.  
  217.